home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 46
/
Aminet 46 (2001)(GTI - Schatztruhe)[!][Dec 2001].iso
/
Aminet
/
text
/
edit
/
edt10src.lha
/
txt
/
Kernel.mod
< prev
next >
Wrap
Text File
|
1995-03-20
|
7KB
|
331 lines
(*
.name Kernel
.task core instructions
.release 1.0
.language Oberon-2
.translator Amiga Oberon 3.11
.system AmigaOS 2.04/2.1/3.0
.author Joachim Barheine
.address Hochgrevestraße 3, D-38640 Goslar
.copyright (c) 1994 by Joachim Barheine
*)
(* .info: 29/09/94, 12:51:17, version 26 *)
(* $TypeChk- *)
MODULE Kernel; (* $JOIN KernelAsm.o *)
IMPORT
SYS:= SYSTEM,
ASL,
Dos,
Err:= ErrCodes,
Exec,
GadTools,
Graphics,
I:= Intuition,
IFFParse,
RexxSysLib,
Util:= Utility;
CONST
undef* = -1; (* undefined parameter value *)
(* result codes *)
rcOk* = 0;
rcWarn* = 5;
rcImportantNotFound* = 12;
rcIllegal* = 15;
rcAborted* = 20;
(* $IF M2Amiga THEN *)
alertRaw= "---M2Edt failed: error #%lx\x00\x00";
alertLib= "---M2Edt failed: missing %s\x00\x00";
version= "\o$VER: M2Edt 1.0 (20.3.94)";
(* $ELSE *)
alertRaw= "---Edt failed: error #%lx\x00\x00";
alertLib= "---Edt failed: missing %s\x00\x00";
version= "\o$VER: Edt 1.0 (20.3.94)";
(* $END *)
TYPE
ANY* = UNTRACED POINTER TO ANYDesc;
ANYDesc* = RECORD END;
Data= UNTRACED POINTER TO ARRAY OF ANY;
DynArray* = RECORD
array: Data;
len-, step- : INTEGER;
END;
DynString* = UNTRACED POINTER TO ARRAY OF CHAR;
VAR
execVer- , intVer- , aslVer- , gfxVer- , gtVer- : INTEGER;
memAlert*: BOOLEAN; (* very few memory *)
(* -- dynamic arrays -- *)
PROCEDURE (v: ANY) Dispose* ;
END Dispose;
PROCEDURE (VAR a: DynArray) Extend(len: INTEGER);
VAR
old: Data;
i: INTEGER;
BEGIN
old:= a.array;
NEW(a.array, len);
FOR i:= 0 TO SHORT(LEN(old^) - 1) DO a.array[i]:= old[i] END;
FOR i:= SHORT(LEN(old^)) TO len - 1 DO a.array[i]:= NIL END;
DISPOSE(old);
END Extend;
PROCEDURE (VAR a: DynArray) New* (len, step: INTEGER);
VAR
i: INTEGER;
BEGIN
NEW(a.array, len);
FOR i:= 0 TO len - 1 DO a.array[i]:= NIL END;
a.len:= 0;
a.step:= step;
END New;
PROCEDURE (VAR a: DynArray) Dispose* ;
VAR
i: INTEGER;
BEGIN
FOR i:= 0 TO SHORT(LEN(a.array^) - 1) DO
IF a.array[i] # NIL THEN
a.array[i].Dispose;
DISPOSE(a.array[i]);
END;
END;
DISPOSE(a.array);
END Dispose;
PROCEDURE (VAR a: DynArray) Put* (x: ANY; i: INTEGER);
BEGIN
IF i >= LEN(a.array^) THEN
a.Extend(i + a.step);
ELSIF a.array[i] # NIL THEN
a.array[i].Dispose;
DISPOSE(a.array[i]);
END;
a.array[i]:= x;
IF i >= a.len THEN a.len:= i + 1 END;
END Put;
PROCEDURE (VAR a: DynArray) Delete* (i: INTEGER);
BEGIN
a.Put(NIL, i);
END Delete;
PROCEDURE (VAR a: DynArray) Get* (i: INTEGER): ANY;
BEGIN
RETURN a.array[i];
END Get;
(* -- byte stream functions -- *)
PROCEDURE Read* (s: ARRAY OF SYS.BYTE; VAR pos: LONGINT;
VAR dest: ARRAY OF SYS.BYTE): BOOLEAN;
VAR
i: LONGINT;
(* $CopyArrays- *)
BEGIN
IF LEN(s) >= pos + LEN(dest) THEN
FOR i:= 0 TO LEN(dest)-1 DO dest[i]:= s[pos]; INC(pos) END;
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END Read;
PROCEDURE Match* (VAR s: ARRAY OF SYS.BYTE; VAR pos: LONGINT;
data: ARRAY OF SYS.BYTE): BOOLEAN;
(* $CopyArrays- *)
VAR
i: LONGINT;
BEGIN
IF LEN(s) >= pos + LEN(data) THEN
FOR i:= 0 TO LEN(data)-1 DO
IF data[i] # s[pos] THEN
DEC(pos, i);
RETURN FALSE;
ELSE
INC(pos);
END;
END;
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END Match;
PROCEDURE MatchIC* (VAR s: ARRAY OF CHAR; VAR pos: LONGINT;
keyword: ARRAY OF CHAR): BOOLEAN;
(* $CopyArrays- *)
VAR
i: LONGINT;
BEGIN
IF LEN(s) > pos + LEN(keyword) THEN
i:= 0;
WHILE keyword[i] # 0X DO
IF keyword[i] # Util.ToUpper(s[pos]) THEN
DEC(pos, i);
RETURN FALSE;
ELSE
INC(i); INC(pos);
END;
END;
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END MatchIC;
PROCEDURE ReadInt* (VAR s: ARRAY OF CHAR; VAR pos: LONGINT; VAR val: LONGINT): BOOLEAN;
VAR
p0: LONGINT;
BEGIN
p0:= pos;
val:= 0;
WHILE (s[pos] >= "0") & (s[pos] <= "9") DO
val:= 10 * val + ORD(s[pos]) - ORD("0");
INC(pos);
END;
RETURN pos > p0;
END ReadInt;
(* -- misc -- *)
(* make a <= x <= b *)
PROCEDURE ClipL* (VAR x: LONGINT; a, b: LONGINT);
BEGIN
IF x < a THEN x:= a ELSIF x > b THEN x:= b END;
END ClipL;
(* make a <= x <= b *)
PROCEDURE ClipI* (VAR x: INTEGER; a, b: INTEGER);
BEGIN
IF x < a THEN x:= a ELSIF x > b THEN x:= b END;
END ClipI;
(* make a <= b *)
PROCEDURE SortL* {"KernelAsm.SortL"}(VAR a{8}, b{9}: LONGINT);
(* make a <= b *)
PROCEDURE SortI* {"KernelAsm.SortI"}(VAR a{8}, b{9}: INTEGER);
PROCEDURE* PutCh {"KernelAsm.PutCh"};
(* format a C-style string *)
PROCEDURE FormatString* (VAR dest: ARRAY OF CHAR; fmt: ARRAY OF CHAR;
param: ARRAY OF LONGINT);
(* $CopyArrays- *)
BEGIN
Exec.OldRawDoFmt(fmt, SYS.ADR(param), PutCh, SYS.ADR(dest));
END FormatString;
(* convert integer to string *)
PROCEDURE IntToStr* (VAR str: ARRAY OF CHAR; int: LONGINT);
VAR
args: ARRAY 1 OF LONGINT;
BEGIN
args[0]:= int;
FormatString(str, "%ld", args);
END IntToStr;
PROCEDURE Alert(template: ARRAY OF CHAR; arg: LONGINT);
VAR
alertStr: ARRAY 120 OF CHAR;
a: ARRAY 1 OF LONGINT;
(* $CopyArrays- *)
BEGIN
a[0]:= arg;
FormatString(alertStr, template, a);
alertStr[0]:= 00X; alertStr[1]:= 0EX; alertStr[2]:= 14X;
IF I.DisplayAlert(I.recoveryAlert, alertStr, 35) THEN END;
HALT(Dos.fail);
END Alert;
(* report failure and abort program if 'cond' # TRUE (alert) *)
PROCEDURE Assert* (cond: BOOLEAN; code: LONGINT);
BEGIN
IF ~cond THEN Alert(alertRaw, code) END;
END Assert;
(* report failure and abort program if cond # TRUE (alert) *)
PROCEDURE AssertLib(lib: Exec.LibraryPtr; libName: ARRAY OF CHAR);
(* $CopyArrays- *)
BEGIN
IF lib = NIL THEN Alert(alertLib, SYS.ADR(libName)) END;
END AssertLib;
PROCEDURE FastCopy {"KernelAsm.Copy"} (from{8}: ARRAY OF CHAR; i0{1}: LONGINT;
VAR to{9}: ARRAY OF CHAR; i1{2}: LONGINT;
len{0}: LONGINT);
PROCEDURE Copy* (from: ARRAY OF CHAR; i0: LONGINT;
VAR to: ARRAY OF CHAR; i1: LONGINT;
len: LONGINT);
(* $CopyArrays- *)
BEGIN
Assert((i0 >= 0) & (i0 + len <= LEN(from)) & (i1 >= 0) & (i1 + len <= LEN(to)),
Err.kernelCopy);
FastCopy(from, i0, to, i1, len);
END Copy;
(* MAIN *)
BEGIN
SYS.SETREG(0, SYS.ADR(version));
execVer:= Exec.exec.libNode.version;
Assert(execVer >= 37, Err.kernelNoOS);
AssertLib(ASL.base, "asl.library");
aslVer:= ASL.base.version;
AssertLib(IFFParse.base, "iffparse.library");
AssertLib(RexxSysLib.base, "rexxsyslib.library");
intVer:= I.int.libNode.version;
gfxVer:= Graphics.gfx.libNode.version;
gtVer:= GadTools.base.version;
memAlert:= Exec.AvailMem(LONGSET{}) < 64 * 1024;
END Kernel.